import numpy as np
'''
Transformer模型词嵌入与位置向量计算
'''
# 输入嵌入矩阵（3个词汇，4维嵌入）
word_embeddings = np.array([
    [1, 0, 0, 0],  # "我"的独热编码嵌入
    [0, 1, 0, 0],  # "爱"的独热编码嵌入
    [0, 0, 1, 0]   # "机器学习"的独热编码嵌入
])
# 计算位置编码
def positional_encoding(pos, d_model):
    pe = np.zeros(d_model)  #创建一个所有元素都初始化为 0 的数组，数组的形状由参数指定。
    for i in range(d_model):    # 遍历每个维度
        if i % 2 == 0:  # 偶数维度
            pe[i] = np.sin(pos / np.power(10000, 2*i/d_model))
        else:  # 奇数维度
            pe[i] = np.cos(pos / np.power(10000, 2*(i//2)/d_model))
    return pe
# 计算每个位置的位置编码
pos_encodings = np.array([
    positional_encoding(0, 4),  # pos=0,“我”的位置编码
    positional_encoding(1, 4),  # pos=1,“爱”的位置编码
    positional_encoding(2, 4)   # pos=2,“机器学习”的位置编码
])
final_vectors = word_embeddings + pos_encodings  # 最终向量 = 词嵌入 + 位置编码
print("词嵌入矩阵:\n", word_embeddings)
print("\n位置编码矩阵:\n", np.round(pos_encodings, 4))
print("\n最终向量(词嵌入+位置编码):\n", np.round(final_vectors, 4))
